/**
 * @file osal_log.h
 * @brief 
 * @author Tome (baojian.liu-a1105@aqara.com)
 * @date 2021-02-25
 */
 
// include 
#include "hal_types.h"
#include "osal_mod_cfg.h" 
#include "osal_log_cfg.h"

#include "osal.h"


#ifndef OSAL_LOG_H
#define OSAL_LOG_H

#if ( OS_MOD_LOG_CHNL == 0 )
#include "SEGGER_RTT.h"
#else
#include "hal_uart.h"
#endif
 
 
/****************************************************************************************************************************** 
                                                            const
*******************************************************************************************************************************/












/****************************************************************************************************************************** 
                                                            typedef
*******************************************************************************************************************************/




typedef osal_event_str_msg_t logEvent_t;








/****************************************************************************************************************************** 
                                                            MICRO
*******************************************************************************************************************************/







/****************************************************************************************************************************** 
                                                            declearation
*******************************************************************************************************************************/


#if OS_MOD_LOG_ENABLE
/*
    log initial, MUST call before any LOG function
*/
extern void osal_log_init(void);
extern void osal_log_out(uint8 type, const char* ptr_file,  const char *ptr_func, int line, uint8 newline, const char *fmt, ...);

//#define LOW_RAW(__FMT__ , ...)  SEGGER_RTT_printf(0,__FMT__,##__VA_ARGS__)
#if ( OS_MOD_LOG_CHNL == 0 )
#define LOG_RAW(...)  SEGGER_RTT_printf(0, __VA_ARGS__)
#else
#define LOG_RAW(...)  HalUartPrintf(__VA_ARGS__)
#endif

#define NRF_LOG_PRINT(...)   osal_log_out( __VA_ARGS__)

#define LOG_INTERNAL_INFO(...)          NRF_LOG_PRINT(0,__FILE__,__FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOG_INTERNAL_WARNNING(...)      NRF_LOG_PRINT(1,__FILE__,__FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOG_INTERNAL_ERROR(...)         NRF_LOG_PRINT(2,__FILE__,__FUNCTION__, __LINE__, ##__VA_ARGS__)

#define LOG(...)            LOG_INTERNAL_INFO(LOG_AUTO_WRAP,##__VA_ARGS__)
#define WARN(...)           LOG_INTERNAL_WARNNING(LOG_AUTO_WRAP,##__VA_ARGS__)
#define ERR(...)            LOG_INTERNAL_ERROR(LOG_AUTO_WRAP,##__VA_ARGS__)

#define LOGLN(...)            LOG_INTERNAL_INFO(__VA_ARGS__)
#define WARNLN(...)           LOG_INTERNAL_WARNNING(__VA_ARGS__)
#define ERRORLN(...)          LOG_INTERNAL_ERROR(__VA_ARGS__)





#else

#define osal_log_init()

#define LOG(...)
#define WARN(...)
#define ERR(...)

#define LOG_RAW(...)    




#endif

     
#if LOG_MOD_HEX_DUMP_ENABLE && OS_MOD_LOG_ENABLE

#define LOG_DUMP_HEX(data, size)     \
  {char* log[2];                           \
   util_dump_hex_log(data, size, log);    \
   if(log[1]){LOG("%s%s",log[0], log[1]);}  \
   else {LOG("%s", log[0]);}}
  
   
#define LOG_STRING(str, size)      \
   {char* log[2];                       \
     util_string_log(str,size, log);    \
     if(log[1]){LOG("%s%s",log[0], log[1]);}  \
     else {LOG("%s", log[0]);}}
     

#else

#define LOG_DUMP_HEX(...)
#define LOG_STRING(...)

#endif




/*      
osal_log_cfg.h
#define LOG_MOD_KEY_ENABLE 
...
*/

#define LOG_CODE(X)     LOG_MOD_##X##_ENABLE
  

typedef struct enum_v_str_t_
{
  unsigned int n;
  char*    s;
}enum_v_str_t;
     
// for enum & enum_string print, (debug function)    
#define ENUM_VALUE(_V_)   _V_
#define ENUM_STRING(_STR_)  (#_STR_)
#define ENUM_V_STR(_X_)   { _X_, ENUM_STRING(_X_) } 
     
     
/* External Function */

extern char* get_enum_string(unsigned int val,unsigned int max, const enum_v_str_t* varstr);
     
// sprintf + LOG
extern void util_dump_hex_log(const uint8 *data, uint32 size, char* log[2]);
     
     
extern void util_string_log(const uint8 *data,uint32 size, char* log[2]);  


extern uint8 is_osal_log_printing(void);

extern uint8 osal_log_blocking(void);


/* for input */
extern void osal_log_register(uint8 task_id);

extern void osal_log_poll(void);


#endif //OSAL_LOG_H
